package server;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Scanner;

import common.StatoPartita;

public class SpegniServerThread extends Thread{

	private Server server;
	
	public SpegniServerThread(Server server) {
		this.server = server;
	}

	public void run(){
		Scanner in= new Scanner(System.in);
		boolean sceltaValida=true;
		String esci=null;
		do{
			System.out.println("\nPremi 'e' per spegnere il server");
			esci=in.next();
			
			if(!(esci.equals("e"))){
				System.out.println("\nComando non valido");
				sceltaValida=false;
			}else{
				sceltaValida=true;
			}
		}while( sceltaValida==false );
		//salvo partita
		try {
			salvaPartita();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.exit(0);
	}

	private void salvaPartita() throws IOException {
		FileOutputStream out = null;
		try {
			out = new FileOutputStream("save.ser");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//fermo il thread che controlla i turni
		GestioneTurni turni=server.getPartita().getTurni();
		if(server.getPartita().getGiocatoriInPartita().size()!=0){
			turni.setFermaServer(true);
			turni.interrupt();
			while(turni.isAlive()==true){
				try {
					sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		Partita partita= server.getPartita();
		ArrayList<Giocatore> gInPartita=partita.getGiocatoriInPartita();
		if(gInPartita!=null && gInPartita.size()>0){
			for(Giocatore g: gInPartita){
				partita.getGiocatoriNonInPartita().add(g);
			}
		}	
		ArrayList<Giocatore> gNonInPartita=partita.getGiocatoriNonInPartita();
		if(gNonInPartita!=null && gNonInPartita.size()>0){
			for(Giocatore g: gNonInPartita){
				g.setMioTurno(false);
				g.setInPartita(false);
				g.setLoggato(false);
				g.setToken(null);
				//tolgo i dinosauri dalla mappa
				for(Dinosauro d: g.getDinosauri()){
					((Terra)partita.getMappa().getCaselle()[d.getPosizioneAttuale().getY()][d.getPosizioneAttuale().getX()]).setIdDino(null);
				}
			}
		}
		//salvo gli oggetti
		System.out.println("\nSalvataggio della partita in corso...\n");
		ObjectOutputStream oos = new ObjectOutputStream(out);
		StatoPartita statoPartita= new StatoPartita(partita.getMappa(),partita.getClassifica(),new ArrayList<Giocatore>(0),partita.getGiocatoriNonInPartita(),partita.getUltimoTokenUsato());
		oos.writeObject(statoPartita);
		oos.close();
		System.out.println("\nFine\n");
			
	}
	
					
}
